package com.sjh.baseutils.gson;

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

/**
 * 反序列化时，如果出现异常则直接返回null，避免解析错误
 * @author Extends
 * @date 2020/5/26
 */
public class GsonTypeAdapterFactory implements TypeAdapterFactory {
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        final TypeAdapter<T> adapter = gson.getDelegateAdapter(this, type);
        return new TypeAdapter<T>() {
            @Override
            public void write(JsonWriter out, T value) throws IOException {
                adapter.write(out, value);
            }

            @Override
            public T read(JsonReader in) throws IOException {
                //gson 库会通过JsonReader对json对象的每个字段进项读取,当发现类型不匹配时抛出异常
                try {
                    return adapter.read(in);
                } catch (Throwable e) {
                    e.printStackTrace();
                    //那么我们就在它抛出异常的时候进行处理,让它继续不中断接着往下读取其他的字段就好了
                    in.skipValue();
                    return null;
                }
            }
        };
    }
}
